<?php

namespace app\common\service;

use app\admin\model\cart\Cart;
use app\admin\model\ComFlows;
use app\admin\model\freight\ExpressDelivery;
use app\admin\model\order\AfterSale;
use app\admin\model\order\Order as OrderModel;
use app\admin\model\order\OrderGoodsInfo;
use app\admin\model\order\OrderShipments;
use app\admin\model\store\Goods;
use app\admin\model\store\GoodsExchange;
use app\admin\model\store\GoodsSku;
use app\admin\model\user\User;
use app\admin\model\user\UserBill;
use app\admin\model\user\UserPay;
use app\common\service\store\GoodsCouponService;
use app\common\service\store\PinkService;
use app\common\service\store\SeckillService;
use app\validate\OrderCreateCheck;
use think\exception\ValidateException;
use think\facade\Cache;
use think\facade\Db;


/**
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 * 修改代码的时候记得加注释  通知一声 不要乱改   注释不加 想改就改 后面咋写
 */
class ComFlowsService extends BaseService
{
    /**
     * 分页参数
     * @var mixed
     */
    protected static $pagesize;

    /**
     * 初始化参数
     * Order constructor.
     */
    public function __construct()
    {
        self::$pagesize = config('page.pagesize');
    }

    //校验参数方法
    public static function checkParams($params = [])
    {
        if (!is_array($params)) return false;
        if (empty($params)) return false;
        if (!isset($params)) return false;
        return true;
    }


    /**获取订单列表数据
     * Author:william
     */
    public static function getOrderList()
    {
        //统计订单总数
        $orderCount = ComFlows::orderTypeCount();
        $orderCount['total'] = array_sum($orderCount);
        //订单列表数据
        $orderList = ComFlows::pageOrderList(self::$pagesize);

        //订单各种状态数据
        $orderStatusCount = ComFlows::orderStatusCount();
        $orderStatusCount['total'] = array_sum($orderStatusCount);


        if (!empty($orderList)) {
            $orderList = $orderList->toArray();
        }
        $data['order_list'] = $orderList;
        $data['order_status_count'] = $orderStatusCount;
        $data['order_count'] = $orderCount;
        return $data;
    }

    //获取不同状态订单信息
    public static function getOrderStatus($status)
    {
        $status = ComFlows::orderStatusWhere($status);
        $data = json_decode(json_encode($status), true);
        return $data;
    }

    /**
     * 后台按照订单类型和订单状态查询
     * Author:William
     */
    public static function orderStatusType($type, $value)
    {
        $where = [];
        if ($type == 'ordertype') {
            switch ($value) {
                case 1:
                    break;
                case 2:
                    //普通
                    $where [] = ['pink_id', '=', 0];
                    $where [] = ['combination_id', '=', 0];
                    $where [] = ['bargain_id', '=', 0];
                    $where [] = ['is_system_del', '=', 0];
                    break;
                case 3:
                    //拼团
                    $where [] = ['pink_id|combination_id', '>', 0];
                    $where [] = ['is_system_del', '=', 0];
                    break;

                case 4:
                    //秒杀
                    $where [] = ['seckill_id', '>', 0];
                    $where [] = ['is_system_del', '=', 0];
                    break;
                case 5:
                    //砍价
                    $where [] = ['bargain_id', '>', 0];
                    $where [] = ['is_system_del', '=', 0];
                    break;
            }
        } elseif ($type = 'status') {
            switch ($value) {
                case 1://全部
                    break;
                case 2://未支付
                    $where[] = ['status', '=', 0];
                    $where[] = ['status', '=', 0];
                    $where[] = ['refund_status', '=', 0];
                    $where[] = ['is_del', '=', 0];
                    break;
                case 3://未发货
                    $where[] = ['pay_status', '=', 1];
                    $where[] = ['status', '=', 0];
                    $where[] = ['shipping_type', '=', 1];
                    $where[] = ['refund_status', '=', 0];
                    $where[] = ['is_del', '=', 0];
                    break;
                case 4://待收货
                    $where[] = ['pay_status', '=', 1];
                    $where[] = ['status', '=', 1];
                    $where[] = ['shipping_type', '=', 1];
                    $where[] = ['refund_status', '=', 0];
                    $where[] = ['is_del', '=', 0];
                    break;
                case 5://待评价
                    $where[] = ['pay_status', '=', 1];
                    $where[] = ['status', '=', 2];
                    $where[] = ['refund_status', '=', 0];
                    $where[] = ['is_del', '=', 0];
                    break;
                case 6://交易完成
                    $where[] = ['pay_status', '=', 1];
                    $where[] = ['status', '=', 3];
                    $where[] = ['refund_status', '=', 0];
                    $where[] = ['is_del', '=', 0];
                    break;
                case 7://待核销
                    $where[] = ['pay_status', '=', 1];
                    $where[] = ['refund_status', '=', 0];
                    break;
                case 8://已核销
                    $where[] = ['pay_status', '=', 1];
                    $where[] = ['status', '=', 2];
                    break;
                case 9://已删除
                    $where[] = ['is_del', '=', 1];
                    break;
            }
        } elseif ($type == 'paytype') {
            switch ($value) {
                case 0:
                    break;
                case 1:
                    $where[] = ['pay_type', '=', 1];
                    break;
                case 2:
                    $where[] = ['pay_type', '=', 2];
                    break;
                case 3:
                    $where[] = ['pay_type', '=', 3];
                    break;
                case 4:
                    $where[] = ['pay_type', '=', 4];
                    break;
            }
        }
        $orderInfo = OrderModel::where($where)->paginate(3)->toArray();
        return self::success('查询成功', $orderInfo);
    }


    /**
     * 08/14  10:42
     * Author：William
     * 根据订单状态值，返回不同订单状态信息
     */
    public static function orderStatusInfo($status, $uid)
    {
        $redis = Cache::store('redis');
        $redis->select(11);
        $bool = $redis->has("orderCenterList:{$status}:user_id:{$uid}");
        if ($bool) {
            $orderParams = $redis->get("orderCenterList:{$status}:user_id:{$uid}");
        } else {
            $orderModel = OrderModel::statusByWhere($status);
            $orderParams = $orderModel
                ->where('user_id', $uid)
                ->with(['orderGoodsInfo', 'orderGoodsInfo.goodsSku', 'orderGoodsInfo.goodsSku.good'])
                ->select();
            $orderParams && $orderParams = $orderParams->toArray();
            if (empty($orderParams)) {
                //如果为空 五分钟过期时间
                $redis->set("orderCenterList:{$status}:user_id:{$uid}", $orderParams, 300);
            }
            $redis->set("orderCenterList:{$status}:user_id:{$uid}", $orderParams);
        }
        return self::success('查询成功', $orderParams);
    }

    /**
     * Author:Yingbo Sun
     * 查询售后信息
     * @param $status int 售后状态
     * @param $uid int 用户id
     * @return array
     * @throws \Psr\SimpleCache\InvalidArgumentException
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function orderAfterSale($status, $uid)
    {
        if (empty($uid)) {
            return self::fail('参数错误');
        }
        $userId = md5($uid);
        $redis = Cache::store('redis');
        $redis->select(12);
        $bool = $redis->has("orderAfterSaleList:{$status}:user_id:{$userId}");
        if ($bool) {
            $data = $redis->get("orderAfterSaleList:{$status}:user_id:{$userId}");
        } else {
            $where[] = ['user_id', '=', $uid];
            $where[] = ['refund_status', '=', $status];
            $data = OrderModel::where($where)
                ->with(['orderGoodsInfo', 'orderGoodsInfo.goodsSku', 'orderGoodsInfo.goodsSku.good'])
                ->select();
            $data && $data = $data->toArray();
            if (empty($data)) {
                //如果为空 五分钟过期时间
                $redis->set("orderAfterSaleList:{$status}:user_id:{$userId}", $data, 300);
            }
            $redis->set("orderAfterSaleList:{$status}:user_id:{$userId}", $data);
        }
        return self::success('获取成功', $data);
    }


    public static function orderByCart($cartIds)
    {
        $skuArr = [];
        $cart = [];
        if (strpos($cartIds, ',')) {
            $cartIdArr = explode(',', $cartIds);
            foreach ($cartIdArr as $v) {
                if (is_int($v) || $v <= 0) {
                    return self::fail('参数错误');
                }
                $cart[] = $v;
                $carts = Cart::find($v)->toArray();
                $skuArr[$carts['sku_id']] = $carts['cart_num'];
            }
        } else {
            $cartIds = intval($cartIds);
            $cart [] = $cartIds;
            if ($cartIds <= 0) {
                return self::fail('参数错误');
            }
            $carts = Cart::find($cartIds)->toArray();
            $skuArr[$carts['sku_id']] = $carts['cart_num'];
        }
        return [$skuArr, $cart];
    }

    /**
     * 创建订单
     * Author:William
     * @param int $params ['order_type_code'] 订单类型 1普通 2 拼团 3 砍价 4 秒杀
     * @param array $params 订单参数
     */
    public static function orderCreate($params = [])
    {
        try {
            validate(OrderCreateCheck::class)->check($params);
        } catch (ValidateException $e) {
            // 验证失败 输出错误信息
            return self::fail($e->getError());
        }

        //订单其余参数
        if ($params['order_type_code'] == 1) {
            //普通订单 秒杀,砍价,拼团 为0
        } elseif ($params['order_type_code'] == 2) {
            //拼团订单 订单
            $params['pink_id'] = $params['pink_id'];
        } elseif ($params['order_type_code'] == 3) {
            //秒杀活动id
            $params['pink_id'] = $params['seckill_id'];
            //秒杀订单
            //SeckillService::queOrder($orderRes['order_no'], $params['sku_id']);
        } elseif ($params['order_type_code'] == 4) {
            //砍价订单
            $params['bargain_id'] = $params['bargain_id'];
        }
        if (isset($params['cart_ids'])) {
            $result = self::orderByCart($params['cart_ids']);
            $skuArr = $result[0];
            $cart = $result[1];
            unset($params['cart_ids']);
            $params['skuInfo'] = $skuArr;
        } else {
            $skuArr = [];
            $cart = [];
            $skuArr[$params['sku_id']] = intval($params['num']);
        }
        $params['skuInfo'] = $skuArr;
        //验证库存
        //$goodsSkuNum = OrderModel::orderNum($params['goods_sku_id']);
//        if (empty($goodsSkuNum)) {
//            return self::fail('库存不足');
//        }
        //验证库存
        $skuNumRes = self::goodsSkuSumCheck($params);
        if ($skuNumRes !== true) {
            return $skuNumRes;
        }
        //计算支付价格
        $params['pay_price'] = self::orderPrice($params);
        //订单编号
        $params ['order_no'] = self::createOrderNo();

        // 启动事务
        Db::startTrans();
        try {
            //生成订单
            $orderRes = OrderModel::create($params);
            $orderRes && $orderRes = $orderRes->toArray();

            //存储商品详情
            $orderGoodsInfo = [];
            //存储用户购买记录
//            $userPay['uid'] = $params['user_id'];
            $userPay['order_id'] = $orderRes['id'];

            foreach ($params['skuInfo'] as $key => $val) {
                $orderGoodsInfo['order_id'] = $orderRes['id'];
                $orderGoodsInfo['goods_sku_id'] = $key;
                $orderGoodsInfo['sku_num'] = $val;
                //查询sku商品的售价、成本价、可分销价
                $userPay['sku_id'] = $key;
                $userPay['sku_num'] = $val;
                $sku = GoodsSku::field(['sku_price', 'sku_cost_price', 'sku_retail_price'])->find($userPay['sku_id'])->toArray();
                $userPay = array_merge($userPay, $sku);
                $result = UserPay::create($userPay);
                if ($result == false) {
                    return self::fail('存储用户购买记录失败');
                }
                //添加商品详情
                $res = OrderGoodsInfo::create($orderGoodsInfo);
                if ($res == false) {
                    return self::fail('商品详情添加失败');
                }
            }

            //减商品库存
            $res = GoodsSku::reduceSkuNum($params);
            if ($res == false) {
                return self::fail('订单创建失败');
            }
            if (count($cart) > 0) {
                foreach ($cart as $value) {
                    CartService::delCart($params['user_id'], $value);
                }
            }
            //生成的订单存入redis设置过期时间
            self::expiredDeleteOrder($params['order_no']);
            $redis = Cache::store('redis');
            $redis->select(11);
            $redis->delete("orderCenterList");
            // 提交事务
            Db::commit();
            return self::success('订单创建成功', $orderRes);
        } catch (\Exception  $e) {
            // 回滚事务
            Db::rollback();
            return self::fail('订单创建失败' . $e->getMessage(),$e->getLine());
        }
    }

    /**
     * 生成订单编号
     * @param string $prefix
     * @return string
     */
    public static function createOrderNo($prefix = 'EA')
    {
        return $prefix . date('YmdHis', time()) . substr(microtime(), 2, 6) . sprintf('%03d', rand(0, 999));
    }

    /**
     * 订单校验库存
     * Author:William
     * @param array $params
     * @return array|bool
     */
    public static function goodsSkuSumCheck(array $params = [])
    {
        //普通订单
        if ($params['order_type_code'] == 1) {
            //查询出商品skuid 对应的库存
            foreach ($params['skuInfo'] as $key => $val) {
                $stuStock = GoodsSku::where('id', $key)->value('sku_stock');
                if ($stuStock < $val) {
                    $msg = "skuId为{$key}的库存为{$stuStock},库存不足";
                    return self::fail($msg);
                }
            }
        }
        return true;
    }

    /**
     * 给订单设置一个过期时间
     * Author:William
     * @param string $orderNo
     * @return bool
     */
    public static function expiredDeleteOrder(string $orderNo)
    {
        //给订单一个过期时间存入redis中
        $key = config('setting.order_redis.order_status_key');
        $time = intval(config('setting.order_redis.order_expire')) + time();
        $redis = Cache::store('redis');
        $redis->select(3);
        $res = $redis->zadd($key, $time, $orderNo);
        if ($res != false) {
            return true;
        }
    }


    public static function orderPrice(array $params = [])
    {
        $arr = [];
        if ($params['order_type_code'] == 1) {
            foreach ($params['skuInfo'] as $key => $val) {
                //商品sku价格
                $skuPrice = GoodsSku::where('id', $key)->value('sku_price');
                $price = $skuPrice * $val;
                $arr [$key] = $price;
            }
        } else {
            //活动价格
            $skuPrice = $params['pay_price'];
            $arr[] = $skuPrice;
        }
        //邮费价格
        $deliveryPrice = ExpressDelivery::where('id', $params['postage_id'])
            ->where('is_postage', 1)
            ->value('default_price');
        //统计普通订单sku总价
        $totalPrice = array_sum($arr);
//        $couponId = $params['coupon_id'];
//        if ($couponId != 0){
//            $totalPrice = GoodsCouponService::useCoupon($couponId,$totalPrice,$params['user_id']);
//        }
        return $totalPrice;
    }

    /**
     * 订单支付
     * Author:William
     * @param string $orderNo 订单编号
     * @param int $pay_status 支付状态1 立即付款  2未付款
     */
    public static function orderPay($orderNo, $pay_status)
    {
        if ($pay_status == 1) {
            $res = OrderModel::where('order_no', $orderNo)->update(['pay_status' => 1]);
            if ($res !== false) {
                $orderInfo = OrderModel::where('order_no', $orderNo)->find()->toArray();
                return self::success('支付成功', $orderInfo);
            }
            return self::fail('订单支付异常');
        } elseif ($pay_status == 2) {
            $res = OrderModel::where('order_no', $orderNo)->update(['pay_status' => 0]);
            $orderInfo = OrderModel::where('order_no', $orderNo)->find()->toArray();
            return self::success('请尽快支付订单', $orderInfo);
        }
    }

    /**
     * 处理订单过期的方法
     * Author:William
     */
    public static function CheckOrderStatus()
    {
        $key = config('setting.order_redis.order_status_key');
        $time = time();
        $result = Cache::store('redis')->zRangeByScore($key, 0, $time, ['limit' => [0, 1]]);
        if (empty($result) || empty($result[0])) {
            return false;
        }
        try {
            $delRedis = Cache::store('redis')->zRem($key, $result[0]);
        } catch (\Exception $e) {
            //记录日志
            $delRedis = '';
        }
        if ($delRedis) {
            echo '在redis缓存里，删除订单号为' . $result[0] . '的订单，还需要修改数据库订单表对应数据的状态';
        } else {
            return false;
        }
        return true;
    }

    /**
     * 订单退款
     * 申请退款状态  改变订单状态
     * Author:William
     */
    public static function refund($params = [])
    {
        $order = OrderModel::where('order_no', $params['order_no'])->find();
        if (empty($order)) {
            return self::fail('订单不存在,退款失败');
        }
        $after_sale['uid'] = $order->uid;
        $after_sale['oid'] = $params['order_no'];
        //$after_sale['refund_type'] = '1';
        $after_sale['refund_reason_wap'] = $params['refund_reason_wap'];
        $after_sale['refund_price'] = $params['refund_price'];
        $after_sale['refund_reason_wap_explain'] = $params['refund_reason_wap_explain'];
        $after_sale['refund_reason_wap_img'] = $params['refund_reason_wap_img'];
        $after_sale['refund_reason_time'] = time();
        $after_sale['is_status'] = 0; //退款状态 0退款中 1退款成功 2取消退款
        //修改退款订单状态  0 未退款 1 申请中 2 已退款
        if ($order['status'] != -1 && $order['refund_status'] != 1) {
            $params['status'] = -1;
            $params['refund_status'] = 1;
            $res = OrderModel::refund($params);
            if ($res !== false) {
                $data = AfterSale::where('oid', $after_sale['oid'])->find();
                if ($data) {
                    AfterSale::where('oid', $after_sale['oid'])->update($after_sale);
                } else {
                    AfterSale::create($after_sale);
                }
                return self::success('申请成功', $res);
            } else {
                return self::fail('无需重复提交申请');
            }
        } else {
            return self::fail('已经在退款');
        }
    }

    /**
     * Author:Yingbo Sun
     * 取消退款 改变订单状态
     * @param $post
     * @return array
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function cancelRefund($post)
    {
        if (empty($post['order_no'])) {
            return self::fail('参数错误，从新请求');
        }
        $order = OrderModel::where('order_no', $post['order_no'])->find();
        if (empty($order)) {
            return self::fail('订单不存在，取消退款失败');
        }
        //修改退款订单状态  0 未退款 1 申请中 2 已退款
        if ($order['refund_status'] != 0 && $order['refund_status'] != 2 && $order['status'] != 3) {//取消退款状态
            $params['status'] = 3; //改变状态 3待评价
            $params['refund_status'] = 0;
            //取消退款 更改订单状态
            $res = OrderModel::where('order_no', $post['order_no'])->update($params);
            if ($res !== false) {
                AfterSale::where('oid', $post['order_no'])->update(['is_status' => 2]); //退款状态 0退款中 1退款成功 2取消退款
                return self::success('取消退款成功', $res);
            } else {
                return self::fail('无需重复提交申请');
            }
        } else {
            return self::fail('已经取消了');
        }
    }


    /**
     * Author:Yingbo Sun
     * 自动更新
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function orderConfirmReceive()
    {
        //订单待收货状态
        $status = 1;
        $order = OrderModel::where('status', $status)->field('order_no')->select();
        if ($order) {
            $order = $order->toArray();
        } else {
            //如果没有 直接返回
            return false;
        }
        $order_no = [];
        foreach ($order as $v) {
            $order_no[] = $v['order_no'];
        }
        //十天的时间戳
        $tenDayTime = 60 * 60 * 24 * 10;
        $time = strtotime(date('Y-m-d H:i:s'));
        $times = $time - $tenDayTime;
        $where[] = ['add_time', '<', $times];
        $data = OrderShipments::whereIn('order_no', $order_no)->where($where)->field('order_no')->select();
        if ($order) {
            $data = $data->toArray();
        } else {
            //如果没有 直接返回
            return false;
        }
        $order_num = [];
        foreach ($data as $v) {
            $order_num[] = $v['order_no'];
        }
        $res = OrderModel::whereIn('order_no', $order_num)->update(['status' => 2]);
        if ($res !== false) {
            return "修改成功";
        } else {
            return "修改失败";
        }
    }

    /**
     * Author:Yingbo Sun
     * 兑换商品生成订单
     * @param $exchangeId
     * @param $uid
     * @return array
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function orderIntegralGoods($exchangeId, $uid, $addressId)
    {
        if (empty($uid) || empty($exchangeId) || empty($addressId)) {
            return self::fail('参数错误');
        }
        $user = User::where('id', $uid)->find();
        $exchange = GoodsExchange::where('id', $exchangeId)->find();
        //判断商品库存是否充足
        if ($exchange->stock < 1) {
            return self::fail('商品库存不足');
        }
        //判断用户积分是否够
        if ($user->integral < $exchange->need_integral) {
            return self::fail('积分不足');
        }
        $integral = bcsub($user->integral, $exchange->need_integral, 2);
        //生成订单编号
        $orderNo = self::createOrderNo('JF');
        //生成订单参数
        $params = [
            'user_id' => $uid,//用户id
            'order_no' => $orderNo,//订单编号
            'exchange_id' => $orderNo,//积分活动id
            'addressId' => $exchangeId,//用户地址模板id
            'integral' => $integral,//使用的积分
            'is_integral' => 1
        ];
        //开启事务
        self::beginTrans();
        try {
            $where = ['id' => $user->id];
            //更新用户积分
            $user->update(['integral' => $integral], $where);
            //更新库存
            GoodsExchange::where('id', $exchangeId)->dec('stock', 1)->update();
            //账单记录
            UserBill::expend('积分兑换商品', $uid, $exchange->need_integral, 'integral', 'exchange', '积分兑换商品活动');
            $orderCreateRes = OrderModel::create($params);
            $orderCreateRes && $orderRes = $orderCreateRes->toArray();
//            if ($orderCreateRes == false || $orderCreateRes == null) {
//                return self::fail('订单创建失败');
//            }
            //处理商品详情
            $orderGoodsInfo = [];
            $orderGoodsInfo['order_id'] = $orderCreateRes['id'];
            $orderGoodsInfo['goods_sku_id'] = $exchange->sku_id;
            $orderGoodsInfo['sku_num'] = 1;
            //添加商品详情
            $orderGoodsInfoRes = OrderGoodsInfo::create($orderGoodsInfo);
            self::commitTrans();
        } catch (\Exception $exception) {
            self::rollbackTrans();
            return self::fail('订单创建失败');
        }
        return self::success('兑换订单创建成功');
    }

    // 查询订单一条数据
    public static function orderDetails($orderId)
    {
        $data = OrderModel::where('id', $orderId)->find();
        if (empty($data)) {
            return self::fail('参数错误');
        } else {
            return $data;
        }

    }

    public static function orderGoods($orderId)
    {
        if (empty($orderId)) {
            return self::fail('参数错误');
        }
        $data = OrderGoodsInfo::where('order_id', $orderId)->value('goods_sku_id');
        return $data;
    }

}